import cv2
from easyocr import Reader
from PIL import Image, ImageDraw, ImageFont
import numpy as np

# 1、初始化Reader 对象，用来标记语言
# 第一次加载会自动下载文字识别的模板
reader = Reader(['ch_sim', 'en'])

# 2、读取图片
img_path = '../data/yinwen2.jpg'
img = cv2.imread(img_path)
# 3、调用easyocr 识别文本
result = reader.readtext(img_path)
print(result)
# 文本存储
full_text = ''
# 输出识别 结果
print("开始识别结果：")
for bbox, text, confidence in result:
    if confidence > 0.3:
        # 置信度大于0.7 进行文本读取
        print(f'文本：{text}，置信度：{confidence:.2f}')
        full_text += text + "\n"
        print(f"仅保留字母{bbox[0]},{bbox[1]},{full_text}")
    else:
        print(f"已过滤低的置信度：{text}，置信度：{confidence:.2f}")

# 去除末尾多余的空格
full_text = full_text.strip()
print("处理之后的高置信度文本：", full_text)
# 可视化识别结果
'''
    在opencv图像上显示中文和英文的匹配
    img 原始图像 text： 要显示的文本
    org 图像文本的左上角 fontface：字体类型 此处无使用
    fontScale 字体缩放比例
    color 文本颜色或框体的颜色
    thickness 文本线条粗细
'''


def putText_Chinese(img, text, org, fontFace, fontScale, color, thickness):
    # 转换PIL图像
    # 1、将图像转换为RGB 是pil的格式
    pil_img = Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
    # 加载字体
    # 2、创建绘图对象 展现在pil上面
    draw = ImageDraw.Draw(pil_img)
    try:
        # 3、加载系统的黑体字体，并设置字体大小 20
        font = ImageFont.truetype('simhei.ttf', int(fontScale * 20))
        # 4、org fill是文本颜色 要将opencv的BGR转为RGB（color[2],color[1],color[0]）
        draw.text(org, text, font=font, fill=(color[2], color[1], color[0]))
    except:
        # 如果没有中文字体那么就使用默认字体
        draw.text(org, text, fill=(color[2], color[1], color[0]))
    # 轮回opencv 的格式
    return cv2.cvtColor(np.array(pil_img), cv2.COLOR_RGB2BGR)


# 二、 创建用于显示的图像副本
# 创建原始图像副本用于绘制标注
display_img = img.copy()
# 遍历所有识别的结构，绘制边界框和文本
for bbox, text, confidence in result:
    # 解析边界框的坐标，bbox包含4个顶点的列表
    # 取第一个顶点坐标左上角，第三个顶点是右下角
    (x1, y1), (x2, y2), (x3, y3), (x4, y4) = bbox
    # 将坐标转换为整数
    x1, y1, x3, y3 = int(x1), int(y1), int(x3), int(y3)
    # 绘制矩形框
    cv2.rectangle(display_img, (x1, y1), (x3, y3), (0, 255, 0), 2)
    # 绘制文本
    display_img = putText_Chinese(
        display_img,  # 要绘制的图像
        text,  # 要显示的文本内容
        (x1, y1 - 10),  # 从文本左上角 矩形和文本的距离为上方10像素的距离
        cv2.FONT_HERSHEY_SIMPLEX,  # 字体类型
        0.5,  # 字体缩放比例 防止文本突然变小
        (0, 0, 255),
        1
    )

cv2.imshow('OCR resImg', display_img)
# cv2.imshow('img', img)
cv2.waitKey(0)

